home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
CDC
/
CDCSXSRC.LZH
/
PICBTN_D.S
< prev
next >
Wrap
Text File
|
1995-03-20
|
7KB
|
294 lines
*==============================================*
*
*
* ピクチャボタン定義関数 rel.0.D
* By
* You Utzse@DennouMagicalTeam@Mankaiseisakujo
* 1994-1995
*==============================================*
.include SXCALL.MAC
.include DOSCALL.MAC
.include HASMACRO.MAC
*==============================================*
*だいたいラジオボタンと同じような働きをする
*コントロール定義関数です。
*違いは、全てをPAT4で構成してあることです。
*PAT3,PAT4のパターンはリソースで持たせます。
*
*パターンのリソースハンドルを以下のように
*固定ワークに書き込みます
*
*
*BTTNPAT: dc.l 1 *インアクティブ時
* dc.l 1 *アクティブでOFF時
* dc.l 1 *アクティブでON時
* dc.l 1 *強調表示
*
*CMOpen時に、cUserにはそのテーブルの先頭アドレス
*(ここではBTTNPATです)を与え、さらに、
*
* 最小値= 0 、
* 最大値= 1
*
*を指定してコントロールをオープンします
*cUserを参照するのはオープン時のみです。
*また、cDefDataを使ってはいけません。
*
*パターンのサイズは同一でないと、みっともないです。
*HAS 2.50以上でアセンブル可能です。
*
*謝辞
*
*沖 勝さんのmoCDEF.rを参考にさせていただきました。
*また、SYSTEM.LBを解析して参考にしています。
*==============================================*
*スタック補正なしSXコールマクロ
SX macro num,cnt
.dc.w num
.endm
*スタック補正付きSXコールマクロ
SXCALL macro num,cnt
dc.w num
.if cnt<9
.if cnt<>0
addq.l #cnt,sp
.endif
.else
lea cnt(sp),sp
.endif
.endm
*==============================================*
G_WHITE equ 8 * 白
G_LGRAY equ 9 * 明るいグレー
G_DGRAY equ 10 * 暗いグレー
G_BLACK equ 10 * 黒
C_INBTTN equ 10
*==============================================*
rectangle = 8
.offset 0
cNext: ds.l 1 * 次のコントロールへの handle 0
cWindow: ds.l 1 * 自分が書かれるウィンドウへの pointer 4
cRect: ds.b rectangle * 自分の大きさを示す四角形 8
cVisible: ds.b 1 * 可視/不可視属性 16
cHilite: ds.b 1 * 強調表示/使用不可 17
cValue: ds.w 1 * 現在値 18
cMin: ds.w 1 * 最小値 20
cMax: ds.w 1 * 最大値 22
cDef: ds.l 1 * コントロール定義関数への handle 24
cOption: ds.w 1 * コントロールのオプション 28
cDefData: ds.l 1 * 定義関数のデータ 30
cProc: ds.l 1 * DRAG 時に呼び出される手続き 34
cUser: ds.l 1 * ユーザー用のワークエリア 38
*cTitle: ds.b LASCII * コントロールのタイトル LASCII 42
*control:
.text
*==============================================*
*
* CDEF ENTRY
*
*
.offset 0
ds.l 2
optcode: ds.w 1
ctrlHdl: ds.l 1
command: ds.w 1
param: ds.l 1
.text
*==============================================*
CDEF_START:
link a6,#0
moveq #0,d0
movem.l d1-d7/a1-a5,-(sp)
move.l param(a6),-(sp)
move.w command(a6),-(sp)
move.l ctrlHdl(a6),-(sp)
move.w optcode(a6),-(sp)
BSR cmdBranch
lea.l 12(sp),sp
movem.l (sp)+,d1-d7/a1-a5
unlk a6
rts
*==============================================*
*
* CDEF BRANCH TO COMMAND
*
*
.offset 0
ds.l 1 *sp
optcode2: ds.w 1
ctrlHdl2: ds.l 1
command2: ds.w 1
param2: ds.l 1
.text
*----------------------------------------------*
cmdBranch:
move.l ctrlHdl2(sp),d2 *コントロールレコードへのハンドル
move.l param2(sp),d1 *コマンドごとに違う
move.w command2(sp),d0 *コマンドナンバー
moveq #8,d3 *コマンドの上限
cmp.w d3,d0
bhi Break
add.l d0,d0
move.w jmptbl(pc,d0.l),d3
jmp jmptbl(pc,d3.w)
jmptbl:
dc.w drawctrl-jmptbl *コントロール描画ルーチン
dc.w where_ctrl-jmptbl *コントロール内にポイントがあるか
dc.w calc_ctrl-jmptbl *リージョン計算
dc.w initctrl-jmptbl *コントロール初期化
dc.w Break-jmptbl
dc.w Break-jmptbl
dc.w Break-jmptbl
dc.w Break-jmptbl
dc.w Break-jmptbl
Break:
moveq #0,d0
Break2:
rts
*==============================================*
*
* COMMAND [DRAW]
*
*----------------------------------------------*
ofs = -16
.offset ofs
dc_penmode: ds.w 1
dc_backcolor: ds.w 1
dc_forecolor: ds.w 1
dc_apage: ds.w 1
dc_rect: ds.w 4
.text
*----------------------------------------------*
drawctrl:
link a6,#ofs
movea.l d2,a3 *d2=a3=ctrlHdl
move.l d1,a5 *d1=param
movea.l (a3),a0 *ctrlPtr
movea.w cOption(a0),a4 *cRec_option
movea.l 4(a0),a1 *winPtr
tst.b cVisible(a0) *ctrl Visible?
beq draw_end *if hidden
tst.b $42(a1) *win Visible?
beq draw_end *if hidden
moveq #%0111,d0 *3PAGE
move.w d0,-(sp)
SX __GMAPage,2
move.w d0,dc_apage(a6)
movea.l (a3),a1
ifeq <cmpi.b #-1,cHilite(a1)>
moveq #0,d1 *INACTIVE=offset 0
elseifne <cmpi.b #$b,cHilite(a1)>
ifne <tst.w cValue(a1)>
ifne <cmpi.b #$b,cHilite(a1)>
moveq #8,d1 *ON=offset 8
elseifne <cmpi.b #$b,$13(a5)>
moveq #8,d1
else
unlk a6
bra Break2
endif
else
ifne <cmpi.b #$b,cHilite(a1)>
moveq #4,d1 *OFF=offset 4
elseifne <cmpi.b #$b,$13(a5)>
moveq #4,d1
else
unlk a6
bra Break2
endif
endif
else *PARTCODE=offset 12
moveq #12,d1
endif
move.l cDefData(a1),a0 *a0=hdlTblTopAdr
add.w d1,a0 *nowHdlptr
move.l (a0),a0 *ImgHdl
move.l (a0),a0 *NowRImgPtr
move.l cRect(a1),-(sp) *POINT_T
pea (a0)
SX __GMPutRImg,8
picBtn_end:
move.w dc_apage(a6),-(sp)
SX __GMAPage,2
draw_end:
moveq #0,d0
unlk a6 *スタックは一気に補正
bra Break2
*==============================================*
*
* COMMAND [WHERE]
*
*==============================================*
where_ctrl:
movea.l d2,a5 *hdl
movea.l (a5),a0 *ctrlptr
cmpi.b #-1,cHilite(a0) *if inact branch
beq Break *partcode=0
move.l a0,d0 *ctrlptr
addq.w #8,d0 *rectptr
move.l d1,-(sp) *pt
move.l d0,-(sp) *rect
SXCALL __GMPtInRect,8
cmpi.w #1,d0 *IN?
bne Break *partcode=0
moveq #$b,d0 *partcode=11
bra Break2
*==============================================*
*
* COMMAND [CALC]
*
*コントロールの占めるリージョンを返す
*paramのHSBが立っていたら、THUMBのリージョンを
*かえす(ないのでヌルリージョン)
*
*==============================================*
calc_ctrl:
tst.l d1 *d1=param(rgnHdl)
bge @f *if not HSB =1 branch @@:
move.l d1,-(sp) *rgnhdl
SXCALL __GMNullRgn,4 *THUMBのリージョンを返す
bra Break
@@:
movea.l d2,a1 *d2=cHdl
movea.l (a1),a1 *ctrlptr
move.l cRect(a1),-(sp) *rectptr
move.l d1,-(sp) *rgnhdl
SXCALL __GMRectRgn,8 *コントロールのリージョンを返す
bra Break
*==============================================*
*
* COMMAND [INIT]
*
*CMOpen時に、cUserから渡されたものを、
*レクタングルイメージへのハンドルとみなして
*参照している。cUserを解放するために
*定義関数用のワークにハンドルを移している
initctrl:
movea.l d2,a0 *d2=ctrlHdl
movea.l (a0),a0 *ptr
move.l cUser(a0),cDefData(a0)
bra Break
.end CDEF_START